// object 表示是一个对象
let a: object;
a = {};
a = function () {

};

// {} 用来表示对象中可以包含的属性
// 语法：{属性名： 属性值， 属性名：属性值}
// 在属性名后面加上问号？，表示属性是可选的
// 特点：对象中的属性要和定义的一样不能多不能少
let b: { name: string, age?: 18 };
b = {name: 'Tom', age: 18};

// [propName: string]: any 表示任意属性
let c: {name:string, [propName: string]: any};
c = {name: 'Tom', age: 18};

/**
 * 设置函数结构的类型声明
 *  语法：（形参：类型， 形参：类型...） => 返回值
 */
let d: (a: number, b: number)=> number;
d = function(n1, n2) {
    return n1 + n2;
}

/**
 * 数组的类型声明
 *  类型[]
 *  Array<类型>
 */
let e: string[];
e = ['1', '2', '3'];

let g: Array<number>;
g = [1, 2, 3, 4];

/**
 * enum 枚举
 */
enum Gender {
    Male = 0,
    Female = 1
}

let i: {name: string, gender: Gender};
i = {
    name: '孙悟空',
    gender: Gender.Male
}
console.log(i.gender === Gender.Male);

/**
 * & 表示同时满足的意思
 */
let f: {name: string} & {age: number};
f = {
    name: 'Tom',
    age: 18
}

/**
 * 类型别名
 */
type myType = 1 | 2 | 3 | 4 | 5;
let m: myType;
let n: myType;
m = 5;